package com.totoro.tygeneratedragonblock.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Totoro
 * @version 0.1.0
 * @date 2025/8/10 - 22:35
 * @description
 **/
public class StrUtil {
    /**
     * 获取字符串中指定字符后的所有字符串
     * @param input
     * @param prefix
     * @return
     */
    public static String getPrefixAfter(String input, String prefix) {
        return input.substring(prefix.length());
    }

    /**
     * 判断字符串是否是非负数（可以是0、0.0，格式规范，不能为负数）
     * @param str 待验证的字符串
     * @return 如果是符合要求的非负数返回true，否则返回false
     */
    public static boolean isNonNegativeNumber(String str) {
        // 空字符串直接返回false
        if (str == null || str.trim().isEmpty()) {
            return false;
        }

        // 正则表达式：匹配非负数（包括0和0.0），排除不规范格式
        // 规则：
        // 1. 不能以负号开头
        // 2. 整数形式：0 或 非零开头的正整数（如0、123）
        // 3. 小数形式：整数部分+小数点+小数部分（如0.0、123.45、0.123）
        String regex = "^0$|^[1-9]\\d*$|^0\\.\\d+$|^[1-9]\\d*\\.\\d+$";

        // 先通过正则表达式验证格式
        if (!str.matches(regex)) {
            return false;
        }

        // 进一步验证数值确实是非负数（理论上正则已保证，但双重验证更稳妥）
        try {
            double number = Double.parseDouble(str);
            return number >= 0;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 将输入字符串转换为唯一的英文标识
     * 相同的输入始终返回相同的结果，不同的输入返回不同的结果
     * @param input 输入字符串
     * @return 唯一的英文标识（由字母和数字组成）
     */
    public static String toUniqueEnglish(String input) {
        if (input == null) {
            return "null";
        }

        try {
            // 使用MD5哈希算法，确保相同输入产生相同输出
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] hashBytes = md.digest(input.getBytes());
            // 将哈希字节转换为十六进制字符串（仅包含0-9和a-f）
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                // 转换为两位十六进制数
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }

            // 可以截取前10位作为简短标识（仍保持唯一性）
            return hexString.toString().substring(0, 10);

        } catch (NoSuchAlgorithmException e) {
            // 异常情况下使用简单哈希作为备选方案
            return "hash_" + input.hashCode();
        }
    }
}
